# -*- coding: UTF-8 -*- #
"""
-------真正的勇士， 敢于直面惨淡的Warning、 敢于正视淋漓的Error-----
@author : 贾鹏博
@file : 16、电子商城接口自动化测试实战.py
@time : 2022/6/25 23:20
"""
import json
import allure
import pytest
from apptest.Logger import logger

"""
后台：litemall.hogwarts.ceshiren.com
用户：litemall.hogwarts.ceshiren.com/vue/index.html
swagger : http://mall.hogwarts.ceshiren.com/swagger-ui.html#/

研发技术评审：
    概要设计，表设计，接口文档设计

接口测试流程：
    1.需求分析
    2.测试设计
    3.测试用例评审
    4、执行冒烟自动化测试用例。通过 -> 执行全量测试 。 不通过 -> 打回，开发重新提测
    5.测试执行
    6.验收
    7.全量回归自动化测试用例 ： 接口 和 UI
    8.预发布
    9.上线

产品需求分析：
    1、上架商品
    2、查询商品
    3、客户端界面加入购物车。添加成功断言

测试用例设计思路:
    1.基本功能流程测试(P0)：冒烟测试 、 正常流程覆盖测试
    2.基于输入域的测试(P1) - 基于研发的接口文档比较完善且所有功能流程自动化用例全部完成：
        单接口的字段测试
        边界值测试、特殊字符校验、参数类型校验、必选参数校验、组合参数校验、有效性校验、默认值校验、排重逻辑
    3.接口幂等性
    4.故障注入：Redis故障降级测试、服务故障转移测试
    5.线程安全测试：并发测试、分布式测试、数据库读写安全测试

接口自动化脚本编写：
    1、上架商品
    2、查询商品列表，获取 商品 ID
    3、查询商品详情，获取商品 库存 ID
    4、加入购物车
    思路：
        1.获取接口信息：1、抓包 2 、swagger
        2.单步调通接口后，根据业务流程串联起来
        3.添加断言，确认流程正常   
"""

import random
import string
import requests


class TestLitemall:

    # 登录接口，获取全局的 token
    def setup_class(self):
        # 1、管理端登录接口
        url = "http://litemall.hogwarts.ceshiren.com/admin/auth/login"
        login_data = {"username": "admin123", "password": "admin123", "code": ""}
        headers = {"Content-Type": "application/json"}
        r = requests.post(url, json=login_data, headers=headers)
        self.token = r.json()["data"]["token"]
        # 2、用户端登录接口
        client_url = "http://litemall.hogwarts.ceshiren.com/wx/auth/login"
        client_data = {"username": "user123", "password": "user123"}
        client_r = requests.post(url=client_url, json=client_data)
        self.client_token = client_r.json()["data"]["token"]

    # 清理数据  删除接口
    def teardown(self):
        url = "http://litemall.hogwarts.ceshiren.com/admin/goods/delete"
        data = {"id": self.goodsId}
        r = requests.post(url, json=data, headers={"X-Litemall-Admin-Token": self.token})
        logger.debug(f"删除接口的响应信息为{json.dumps(r.json(), indent=2, ensure_ascii=False)}")
        # 客户端购物车删除
        client_url = "http://litemall.hogwarts.ceshiren.com/wx/cart/delete"
        client_data = {"productIds": self.productId}
        client_r = requests.post(client_url, json=client_data, headers={"X-Litemall-Token": self.client_token})
        logger.debug(f"删除购物车接口的响应信息为{json.dumps(client_r.json(), indent=2, ensure_ascii=False)}")

    @pytest.mark.parametrize("goods_name", ["商品6", "商品8"], ids=["goods_1", "goods_2"])
    def test_add_goods(self, goods_name):
        # 随机生成 5 位数的商品名称    由于商品名称一般都是固定好的
        # goods_name = "".join(random.choice(string.ascii_letters + string.digits) for _ in range(5))
        # 3、上架商品接口
        url = "http://litemall.hogwarts.ceshiren.com/admin/goods/create"
        goods_data = {
            "goods": {"picUrl": "", "gallery": [], "isHot": False, "isNew": True, "isOnSale": True, "goodsSn": "9001",
                      "name": goods_name},
            "specifications": [{"specification": "规格", "value": "标准", "picUrl": ""}],
            "products": [{"id": 0, "specifications": ["标准"], "price": "88", "number": "99", "url": ""}],
            "attributes": []}
        r = requests.post(url, json=goods_data,
                          headers={"X-Litemall-Admin-Token": self.token})
        print(r.json())
        logger.debug(f"上架商品接口的响应信息为{json.dumps(r.json(), indent=2, ensure_ascii=False)}")
        # 4、获取商品列表接口 ，获取 self.goodsId。在服务端 admin
        goodsId_url = "http://litemall.hogwarts.ceshiren.com/admin/goods/list"
        goodsId_data = {"name": goods_name, "order": "desc", "sort": "add_time"}
        goodsId_r = requests.get(goodsId_url, headers={"X-Litemall-Admin-Token": self.token},
                                 params=goodsId_data)
        print(goodsId_r.json())
        logger.debug(f"获取商品列表接口的响应信息为{json.dumps(goodsId_r.json(), indent=2, ensure_ascii=False)}")
        self.goodsId = goodsId_r.json()["data"]["list"][0]["id"]
        # 5、获取商品详情接口，获取 self.productId。在服务端 admin
        productId_url = "http://litemall.hogwarts.ceshiren.com/admin/goods/detail"
        productId_data = {"id": self.goodsId}
        productId_r = requests.get(productId_url, params=productId_data,
                                   headers={"X-Litemall-Admin-Token": self.token})
        print(productId_r.json())
        logger.debug(f"获取商品详情接口的响应信息为{json.dumps(productId_r.json(), indent=2, ensure_ascii=False)}")
        self.productId = productId_r.json()["data"]["products"][0]["id"]
        print(self.productId)
        # 6、客户端添加到购物车接口
        url = "http://litemall.hogwarts.ceshiren.com/wx/cart/add"
        add_data = {"goodsId": self.goodsId, "number": 1, "productId": self.productId}
        headers = {"X-Litemall-Token": self.client_token}
        r = requests.post(url, json=add_data, headers=headers)
        logger.info(f"客户端添加到购物车接口的响应信息为{json.dumps(r.json(), indent=2, ensure_ascii=False)}")
        res = r.json()
        assert res["errmsg"] == "成功"

#  pytest .\16、电子商城接口自动化测试实战.py --alluredir ./report
# allure serve ./report
